/**
 *
 * @author Juan Pablo
 *
 */

public class LineaCache {
	// atributos de clase
	private int[] datos;
	private int grupo, bloqueRam;
	private boolean actualizado;

	/**
	 * metodo constructor
	 *
	 * @param datos,
	 *            arreglo con los datos de un bloque de ram
	 * @param direccion,
	 *            direccion del bloque de la ram
	 */
	public LineaCache(int[] datos, int direccion) {
		bloqueRam = Utilidades.calcularBloqueRam(direccion);
		this.datos = new int[5];
		this.datos[0] = Utilidades.calcularTag(direccion);
		for (int i = 1; i < this.datos.length; i++) {
			this.datos[i] = datos[i - 1];
		}
		grupo = Utilidades.calcularGrupo(direccion);
		actualizado = false;
	}

	/**
	 *
	 * @return retorna el tag equivalente a esta linea
	 */
	public int getTag() {
		return datos[0];
	}

	/**
	 *
	 * @return retorna la linea de cache
	 */
	public int[] getLinea() {
		return datos;
	}

	/**
	 * metodo para obtener el bloque de esta linea de cache
	 *
	 * @return, arreglo de enteros con el bloque
	 */
	public int[] getBloque() {
		int[] bloque = new int[Utilidades.PALABRASPORLINEA];
		for (int i = 0; i < bloque.length; i++) {
			bloque[i] = datos[i + 1];
		}
		return bloque;
	}

	/**
	 *
	 * @return retorna el grupo al que pertenece esta linea
	 */
	public int getGrupo() {
		return grupo;
	}

	/**
	 *
	 * @return la primera direccion del bloque al que pertenecen los datos
	 */
	public int getBloqueRam() {
		return bloqueRam;
	}

	/**
	 * metodo para saber si se encuentra actualiazada la linea
	 *
	 * @return, retorn el booleano de si esta o no actualiazada esta linea
	 */
	public boolean getActualizado() {
		return actualizado;
	}

	/**
	 * reemplaza el valor de actualizado
	 *
	 * @param actualizado,
	 *            boolean con el valor nuevo de actualizado
	 */
	public void setActualizado(boolean actualizado) {
		this.actualizado = actualizado;
	}
	/**
	 * metodo para sobreescribir el bloque de esta linea
	 * @param bloque, bloque nuevo que se quiere escribir
	 */
	public void setBloque(int[] bloque){
		for (int i = 1; i < Utilidades.PALABRASPORLINEA+1; i++) {
			datos[i]=bloque[i-1];
		}
	}

}
